package com.atguigu.gmall.product.service.impl;



import com.atguigu.gmall.product.model.SkuAttrValue;
import com.atguigu.gmall.product.model.SkuImage;
import com.atguigu.gmall.product.model.SkuInfo;
import com.atguigu.gmall.product.model.SkuSaleAttrValue;
import com.atguigu.gmall.product.service.*;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.math.BigDecimal;
import java.util.List;

@Service
public class SkuManageServiceImpl implements SkuManageService {


    @Autowired
    private SkuInfoService skuInfoService;

    @Autowired
    private SkuImageService skuImageService;

    @Autowired
    private SkuAttrValueService skuAttrValueService;

    @Autowired
    private SkuSaleAttrValueService skuSaleAttrValueService;






    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveSkuInfo(SkuInfo skuInfo) {
        //1.将提交的商品SKU基本信息封装为SkuInfo对象 存入sku_info表
        skuInfoService.save(skuInfo);
        Long skuId = skuInfo.getId();
        //2.将提交商品SKU图片封装为SkuImage集合 存入sku_image表
        List<SkuImage> skuImageList = skuInfo.getSkuImageList();
        if (!CollectionUtils.isEmpty(skuImageList)) {
            skuImageList.stream().forEach(skuImage -> {
                skuImage.setSkuId(skuId);
            });
            skuImageService.saveBatch(skuImageList);
        }

        //3.将提交商品SKu平台属性信息 封装 SkuAttrValue集合 存入sku_attr_value表
        List<SkuAttrValue> skuAttrValueList = skuInfo.getSkuAttrValueList();
        if (!CollectionUtils.isEmpty(skuAttrValueList)) {
            skuAttrValueList.stream().forEach(skuAttrValue -> {
                skuAttrValue.setSkuId(skuId);
            });
            skuAttrValueService.saveBatch(skuAttrValueList);
        }
        //4.将提交商品SKu销售属性信息 封装 SkuSaleAttrValue集合 存入sku_sale_attr_value表
        List<SkuSaleAttrValue> skuSaleAttrValueList = skuInfo.getSkuSaleAttrValueList();
        if (!CollectionUtils.isEmpty(skuSaleAttrValueList)) {
            skuSaleAttrValueList.stream().forEach(skuSaleAttrValue -> {
                skuSaleAttrValue.setSkuId(skuId);
                skuSaleAttrValue.setSpuId(skuInfo.getSpuId());
            });
            skuSaleAttrValueService.saveBatch(skuSaleAttrValueList);
        }
    }

    // 根据分类ID查询商品SKU列表

    @Override
    public Page<SkuInfo> getSkuListByPage(Page<SkuInfo> infoPage, Long category3Id) {
        //1.构建查询条件 排序条件
        LambdaQueryWrapper<SkuInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(SkuInfo::getCategory3Id, category3Id);

        queryWrapper.orderByDesc(SkuInfo::getUpdateTime);
        //2.执行分页查询
        Page<SkuInfo> page = skuInfoService.page(infoPage, queryWrapper);
        return page;
    }

    //商品上架

    @Override
    public void onSale(Long skuId) {
        SkuInfo skuInfo = new SkuInfo();
        skuInfo.setId(skuId);
        skuInfo.setIsSale(1);
        skuInfoService.updateById(skuInfo);
        //TODO 商品上架成功后,需要同步更新ES索引库;Redis缓存;
    }

    // 商品下架

    @Override
    public void cancelSale(Long skuId) {
        //sql update sku_info set is_sale = 0 where id = ?
        LambdaUpdateWrapper<SkuInfo> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(SkuInfo::getId, skuId);
        updateWrapper.set(SkuInfo::getIsSale, 0);
        skuInfoService.update(updateWrapper);
        //TODO 商品下架成功后,需要同步更新ES索引库;Redis缓存;

    }


    //获取商品信息 包含商品图片
    @Override
    public SkuInfo getSkuInfo(Long skuId) {
        //1.根据主键SKUID查询商品SKU基本信息
        SkuInfo skuInfo = skuInfoService.getById(skuId);
        if (skuInfo != null) {
            //2.根据SkuID查询商品SKu图片列表 封装 SkuInfo对象中
            LambdaQueryWrapper<SkuImage> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(SkuImage::getSkuId, skuId);
            List<SkuImage> skuImageList = skuImageService.list(queryWrapper);
            skuInfo.setSkuImageList(skuImageList);
            return skuInfo;
        }
        return null;
    }

    // 根据skuID查询商品价格

    @Override
    public BigDecimal getSkuPrice(Long skuId) {
        SkuInfo skuInfo = skuInfoService.getById(skuId);
        if(skuInfo!=null){
            return skuInfo.getPrice();
        }
        return new BigDecimal("0.00");
    }


}
